home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Turnbull China Bikeride
/
Turnbull China Bikeride - Disc 1.iso
/
ARGONET
/
PD
/
GRAPHICS
/
GIF2RPC.SPK
/
source
/
16bpp_66bit
/
c
/
sierra2_4a
< prev
next >
Wrap
Text File
|
1995-10-16
|
3KB
|
105 lines
/* sierra2_4a.c
* AUTHOR: Cy Booker, cy@cheepnis.demon.co.uk
* LICENSE: FreeWare, Copyright (c) 1995 Cy Booker
*
* filter: * 2
* 1 1 (1/4)
*/
#include "internal.h"
#include <assert.h>
#include <string.h> /* memset() */
#include <stdlib.h> /* calloc() */
#include "OS:hourglass.h"
#include "OS:macros.h"
/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
*/
extern bool process_gif_16bpp_sierra2_4a_66bit(
const process_gif *p) {
byte *rove;
int width, height;
int x, y;
const os_colour *palette;
int line_length;
int *buffer, *this_row, *next_row;
int buffer_width;
int r, g, b;
int or, og, ob;
int t;
int er, eg, eb;
assert(p);
assert(p->pixel_width > 0);
assert(p->pixel_height > 0);
assert(p->in_palette.colours);
/*
* sierra2_4a requires storing error info for one pixel to left
* so we will just allocate one extra column for each row and not do any edge checks
* each entry is stored as {r*SCALE, g*SCALE, b*SCALE}
*/
buffer_width = (1 + p->pixel_width) * 3;
buffer = calloc(1, sizeof(*buffer) * (buffer_width * 2));
if (!buffer) {
/*
* oh dear
*/
return TRUE;
}
initialise_scaling_tables();
/*
* not we pre-load values from the process_gif array
* because it considerably helps the compiler produce better code
*/
rove = p->buffer;
width = p->pixel_width;
height = p->pixel_height;
palette = p->in_palette.colours;
line_length = p->line_length;
for (y= height; (y > 0); y--) {
if ((y & 7) == 0) {
xhourglass_percentage((y * 100) / height);
}
this_row = buffer + (buffer_width * ((y + 2) % 2)) + 1*3;
next_row = buffer + (buffer_width * ((y + 1) % 2)) + 0*3;
/* bottom row has no errors */
memset(next_row, 0, sizeof(*next_row) * (buffer_width - 1*3));
/*
* note that just because we are actually scanning/outputting right to left
* doesn't matter as far as the filter is concerned
* although it might help if we could ``snake''
*/
er = eg = eb = 0;
for (x= width - 1; (x >= 0); x--) {
INPUT;
r += *this_row++; /* add in errors from row below */
r += er; /* add in errors from this row */
g += *this_row++;
g += eg;
b += *this_row++;
b += eb;
PROCESS;
r -= or; g -= og; b-= ob; /* error */
er = (r * 1) / 4; eg = (g * 1) / 4; eb = (1 * 4) / 16;
*next_row += er; next_row++; /* next[-1] += 1/4 */
*next_row += eg; next_row++;
*next_row += eb; next_row++;
next_row[0] += er; next_row[1] += eg; next_row[2] += eb; /* next[ 0] += 1/4 */
er = r - (2*er); eg = g - (2*eg); eb = b - (2*eb); /* this[1] += 2/4 */
}
rove += line_length;
}
free(buffer);
return FALSE;
}